package br.com.advocacia.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.advocacia.entidade.Cidade;
import br.com.advocacia.entidade.Estado;
import br.com.advocacia.logica.contract.CidadeLogicaContract;
import br.com.advocacia.logica.contract.DefaultLogicaContract;
import br.com.advocacia.util.FacesUtil;
import br.com.advocacia.util.StringUtil;

@ManagedBean(name="cidadeFaces")
@ViewScoped
public class CidadeFaces extends FacesUtil {
	
	private static final long serialVersionUID = 4620989756344415646L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Cidade> logicaCidade;
	
	@ManagedProperty(value = "#{cidadeLogica}")
	private CidadeLogicaContract cidadeLogica;
	
	private Estado estado;
	private Cidade cidade = new Cidade();
	private List<Cidade> listaCidade = new ArrayList<>();
	private String cidadeBusca;
	
	public CidadeFaces() {
		if (getSession().getAttribute("estadoSelecionado") != null) {
			this.estado = (Estado) getSession().getAttribute("estadoSelecionado");

		} else {
			adicionarMensagem("Estado não selecionado");
		}
	}
	
	@PostConstruct
	public void init() {
		this.buscarCidade(estado);		
	}

	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaCidade.adicionar(cidade);
				adicionarMensagem("Cidade adicionada com sucesso");
				this.buscarCidade(estado);
				fecharModal("dialogCidade");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Cidade");
		}
	}
	
	public void prepararAdicionar() {
		this.cidade = new Cidade();
		abrirModal("dialogCidade");
	}
	
	public void selecionarRegistro(Long idArea, boolean editar) {
		try {
			this.cidade = logicaCidade.obterPorId(Cidade.class,idArea);
			
			if (editar) {
				abrirModal("dialogCidade");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaCidade.editar(this.cidade);
				adicionarMensagem("Cidade editado com sucesso");
				fecharModal("dialogCidade");
				this.buscarCidade(estado);
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Cidade");
		}
	}
	
	public void remover() {
		try {
			logicaCidade.remover(Cidade.class, this.cidade.getId());
			adicionarMensagem("Cidade removido com sucesso");
			fecharModal("dialogExcluir");
			this.buscarCidade(estado);
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Cidade");
		}
	}
	
	public void buscarCidade(Estado estado) {
		if (listaCidade != null) {
			this.listaCidade.clear();
		}
		
		try {
			this.listaCidade = cidadeLogica.buscarCidadesPorEstado(this.estado.getId(), cidadeBusca);
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		this.cidade.setEstado(this.estado);
		
		if (!StringUtil.textoPreenchido(this.cidade.getNomeCidade())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public void bairrosPorCidade(Cidade cidade) {
		getSession().setAttribute("cidadeSelecionada", cidade);
		redirecionarPagina("bairro.faces");
	}
	
	
	public void setLogicaCidade(DefaultLogicaContract<Cidade> logicaCidade) {
		this.logicaCidade = logicaCidade;
	}

	public List<Cidade> getListaCidade() {
		return listaCidade;
	}

	public void setListaCidade(List<Cidade> listaCidade) {
		this.listaCidade = listaCidade;
	}

	public String getCidadeBusca() {
		return cidadeBusca;
	}

	public void setCidadeBusca(String cidadeBusca) {
		this.cidadeBusca = cidadeBusca;
	}

	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public void setCidadeLogica(CidadeLogicaContract cidadeLogica) {
		this.cidadeLogica = cidadeLogica;
	}
	
	
}